/**
@brief module de gestion de l'IA
@file ennemi.h
@date 2012/06/07
*/

#ifndef __ENNEMI__H
#define __ENNEMI__H

#include "terrain.h"
#include "bombe.h"
#include "chemin.h"


/**
\struct ennemi ennemi.h
@brief contient les coordonnées, le numéro et une heure d'initialisation de l'ennemi
*/
struct ennemi
{
    int num;
    int x;
    int y;
    clock_t heureInit;
};
typedef struct ennemi ennemi;

/**
@brief initialise un ennemi
@param[in,out] ter pointeur sur terrain
@param[in] cooX entier
@param[in] cooY entier
@return pointeur sur ennemi
*/
ennemi* ennemiInit(terrain* ter, const int cooX, const int cooY);

/**
@brief modifie coordonné x de l'ennemi
@param[in,out] ennemi pointeur sur ennemi
@param[in] abs entier
@return none
*/
void ennemiSetX(ennemi* ennemi, const int abs);

/**
@brief modifie coordonné y de l'ennemi
@param[in,out] ennemi pointeur sur ennemi
@param[in] ord entier
@return none
*/
void ennemiSetY(ennemi* ennemi, const int ord);

/**
@brief modifie le numero de l'ennemi
@param[in,out] vilain pointeur sur ennemi
@param[in] i entier
@return none
*/
void ennemiSetNumero(ennemi* vilain, const int i);

/**
@brief recupere coordonné x de l'ennemi
@param[in] vilain pointeur sur ennemi
@return entier
*/
int ennemiGetX(const ennemi* vilain);

/**
@brief recupere coordonné y de l'ennemi
@param[in] vilain pointeur sur ennemi
@return entier
*/
int ennemiGetY(const ennemi* vilain);

/**
@brief recupere le numéro de l'ennemi
@param[in] vilain pointeur sur ennemi
@return entier
*/
int ennemiGetNum(const ennemi* vilain);

/**
@brief libère la mémoire alloué pour l'ennemi
@param[in,out] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiDetruire(ennemi* vilain, terrain* ter);

/**
@brief affiche l'ennemi sur le terrain
@param[in] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiAffiche(const ennemi* vilain, terrain* ter);

/**
@brief renvoi un nombre aleatoire entre a et b-1
@param[in] a entier
@param[in] b entier
@return entier
*/
int nombre_aleatoire(const int a, const int b);

/**
@brief déplace l'ennemi de maniere aléatoire
@param[in,out] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiDeplaceAleatoirement(ennemi* vilain, terrain* ter);

/**
@brief déplace l'ennemi vers le haut
@param[in,out] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiHaut(ennemi* vilain,  terrain* ter);

/**
@brief déplace l'ennemi vers le bas
@param[in,out] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiBas(ennemi* vilain,  terrain* ter);

/**
@brief déplace l'ennemi vers la droite
@param[in,out] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiDroite(ennemi* vilain, terrain* ter);

/**
@brief déplace l'ennemi vers la gauche
@param[in,out] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return none
*/
void ennemiGauche(ennemi* vilain, terrain* ter);

/**
@brief recherche la 1ere case la plus proche de Mario
@param[in] vilain pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@param [in] x entier
@param [in] y entier
@return caractere
*/
char rechercheObjectifAttaque(const ennemi* vilain, terrain* ter, int x, int y);

/**
@brief recherche la case adjacente la plus proche pour eviter un danger
@param[in] ennemi pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@return caractere
*/
char rechercheObjectifDefense(const ennemi* vilain, terrain* ter);

/**
@brief déplace l'ennemi d'une case en fonction de l'objectif
@param[in,out] ennemi pointeur sur ennemi
@param[in,out] ter pointeur sur terrain
@param [in] x entier
@param [in] y entier
@return none
*/
void ennemiDeplaceIA(ennemi* vilain, terrain* ter, const int x, const int y);

/**
@brief recherche les coordonnée de la 1ere case sans danger la plus proche
@param[in,out] ter pointeur sur terrain
@param [in,out] x pointeur sur entier
@param [in,out] y pointeur sur entier
@return none
*/
void caseSansDanger(terrain* ter, int* x, int* y);

/**
@brief ennemi pose une bombe avec une chance sur nbAleatoire-1
@param[in,out] ter pointeur sur terrain
@param [in,out] vilain pointeur sur ennemi
@param [in] nbAleatoire entier
@return none
*/
void ennemiPoseBombe(const ennemi* vilain, terrain* ter, const int nbAleatoire);

#endif
